package com.fpf.lab01_basics;

import java.util.concurrent.ConcurrentHashMap;

public class Demo7_ConcurrentHashMap {
    public static void main(String[] args) throws InterruptedException {
        ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();
        // 十个线程，每个线程插入1000个键值对
        int threadCount = 10, perThread = 1000;

        Thread[] ts = new Thread[threadCount];
        // 循环创建并启动10个线程，每个线程有唯一的keyBase，确保不同线程的键范围不重叠
        for (int i = 0; i < threadCount; i++) {
            int keyBase = i * perThread;
            // 每个线程执行的任务是：循环 perThread（1000）次，每次向 map 中插入一个键值对
            // 键为 keyBase + j，值为 j
            ts[i] = new Thread(() -> {
                for (int j = 0; j < perThread; j++) {
                    map.put(keyBase + j, j);
                }
            });
            ts[i].start();
        }
        for (Thread t : ts) t.join();
        // 等待所有线程执行完毕后，输出map的大小
        System.out.println("map size: " + map.size());
    }
    /*

        与 Collections.synchronizedMap(new HashMap<>()) 不同，ConcurrentHashMap 采用了更高效的并发策略：
           1.内部使用分段锁（Java 8 之前）或 CAS 操作和 synchronized结合的方式（Java 8 及之后）
           2.允许多个线程同时读取，且支持一定程度的并发写入
           3.在多线程环境下性能优于完全同步的集合

     */
}

